package com.t2tierp.pafecf.controller;

import br.com.modelo.Cliente;
import br.com.modelo.EcfVendaCabecalho;
import br.com.modelo.EcfVendaDetalhe;
import br.com.util.JPAUtil;
import com.t2tierp.pafecf.infra.Biblioteca;
import com.t2tierp.pafecf.infra.Ecf;
import com.t2tierp.pafecf.infra.Paf;
import com.t2tierp.pafecf.view.Caixa;
import jACBr.ACBrException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class VendaController {

    public EcfVendaCabecalho iniciaVenda(EcfVendaCabecalho pVendaCabecalho) {
        try {
            if (pVendaCabecalho.getIdCliente() == null) {
                pVendaCabecalho.setIdCliente(new Cliente());
            }
            return (EcfVendaCabecalho) JPAUtil.mergeObjeto(pVendaCabecalho);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public EcfVendaDetalhe inserirItem(EcfVendaDetalhe pVendaDetalhe) {
        //TODO : Como se calcula a base e o valor do ICMS?
        //TODO : Como é feito o calculo dos demais impostos?
        //TODO : Devemos ratear o desconto para os itens? Como fazer isso?
        try {
            switch (pVendaDetalhe.getEcfIcmsSt()) {
                case "NN":
                    pVendaDetalhe.setEcfIcmsSt("N");
                    break;
                case "FF":
                    pVendaDetalhe.setEcfIcmsSt("F");
                    break;
                case "II":
                    pVendaDetalhe.setEcfIcmsSt("I");
                    break;
                default:
                    if (pVendaDetalhe.getTotalizadorParcial().substring(2, 3).equals("S")) {
                        pVendaDetalhe.setEcfIcmsSt(pVendaDetalhe.getTotalizadorParcial().substring(3, 7));
                    } else if (pVendaDetalhe.getTotalizadorParcial().substring(2, 3).equals("T")) {
                        pVendaDetalhe.setEcfIcmsSt(pVendaDetalhe.getTotalizadorParcial().substring(3, 7));
                    } else if (pVendaDetalhe.getTotalizadorParcial().equals("Can-T")) {
                        pVendaDetalhe.setEcfIcmsSt("CANC");
                    } else {
                        pVendaDetalhe.setEcfIcmsSt("1700");
                    }
                    break;
            }

            pVendaDetalhe.setCancelado('N');

            if ((!pVendaDetalhe.getIcms().toString().equals("II")) && (!pVendaDetalhe.getIcms().toString().equals("NN"))) {
//                pstm.setDouble(18, pVendaDetalhe.getTaxaIcms());
            } else {
                pVendaDetalhe.setTaxaIcms(BigDecimal.ZERO);
            }

            BigDecimal icms = BigDecimal.ZERO;
            icms = pVendaDetalhe.getValorTotal().multiply(pVendaDetalhe.getTaxaIcms()).divide(BigDecimal.valueOf(100));
            icms = icms.setScale(Caixa.configuracao.getDecimaisValor(), RoundingMode.DOWN);
            pVendaDetalhe.setIcms(icms);
            pVendaDetalhe.setBaseIcms(pVendaDetalhe.getValorTotal());

            String tripa = Caixa.configuracao.getIdEcfImpressora().getSerie()
                    + pVendaDetalhe.getCoo()
                    + pVendaDetalhe.getCcf()
                    + pVendaDetalhe.getGtin()
                    + Biblioteca.formatoDecimal("Q", Double.parseDouble(pVendaDetalhe.getQuantidade().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(pVendaDetalhe.getValorUnitario().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(pVendaDetalhe.getTotalItem().toString()))
                    + pVendaDetalhe.getTotalizadorParcial() + "N" + "0";

            pVendaDetalhe.setHashTripa(Biblioteca.MD5String(tripa));
            pVendaDetalhe.setHashIncremento(0);

            return (EcfVendaDetalhe) JPAUtil.mergeObjeto(pVendaDetalhe);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void encerraVenda(EcfVendaCabecalho pVendaCabecalho) {
        //TODO : Como se calcula a base e o valor do ICMS?
        pVendaCabecalho = calculaImpostos(pVendaCabecalho);
        //TODO : Como é feito o calculo dos demais impostos?
        try {
            if (pVendaCabecalho.getIdEcfDav() != null) {
                DAVController DAVControl = new DAVController();
                DAVControl.fechaDAV(pVendaCabecalho.getIdEcfDav().getId(), pVendaCabecalho.getCcf(), pVendaCabecalho.getCoo());
            } else {
//                pVendaCabecalho.setIdEcfDav(new DavCabecalho());
            }
            if (pVendaCabecalho.getIdEcfPreVendaCabecalho() != null) {
                PreVendaController preVendaControl = new PreVendaController();
                preVendaControl.fechaPreVenda(pVendaCabecalho.getIdEcfPreVendaCabecalho().getId(), pVendaCabecalho.getCcf());
            } else {
//                pVendaCabecalho.setIdEcfPreVendaCabecalho(new PreVendaCabecalho());
            }
            pVendaCabecalho.setStatusVenda('F');
//            if (pVendaCabecalho.getIdEcfFuncionario() != null) {
//                pstm.setInt(15, pVendaCabecalho.getIdVendedor());
//            } else {
//                pstm.setNull(15, java.sql.Types.INTEGER);
//            }

            String tripa = String.valueOf(pVendaCabecalho.getId())
                    + String.valueOf(pVendaCabecalho.getCcf())
                    + String.valueOf(pVendaCabecalho.getCoo())
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(pVendaCabecalho.getValorFinal().toString()))
                    + pVendaCabecalho.getSerieEcf()
                    + "FN0";

            pVendaCabecalho.setHashTripa(Biblioteca.MD5String(tripa));
            pVendaCabecalho.setHashIncremento(-1);
            pVendaCabecalho.setCupomCancelado('N');

            JPAUtil.mergeObjeto(pVendaCabecalho);

            ProdutoController produtoControl = new ProdutoController();
            produtoControl.atualizaEstoque(vendaDetalhe(pVendaCabecalho.getId()), false);

            Paf.gravaR06("RV");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<EcfVendaDetalhe> vendaAberta() {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM EcfVendaDetalhe c WHERE c.statusVenda = 'A'");
        List<EcfVendaCabecalho> retorno = q.getResultList();
        em.close();
        //caso existam itens, continua com a recuperação da venda
        if (retorno.get(0).getEcfVendaDetalheList().size() > 0) {
            return retorno.get(0).getEcfVendaDetalheList();
        } else {
            //caso tenha sido aberto um cupom, mas não tenha sido inserido nenhum item
            //altera o status da venda para cancelado e chama o método para cancelamento do cupom
            retorno.get(0).setCupomCancelado('S');
            JPAUtil.mergeObjeto(retorno.get(0));
            try {
                Ecf.cancelaCupom();
            } catch (ACBrException ex) {
                Logger.getLogger(VendaController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    public void cancelaVenda(EcfVendaCabecalho pVendaCabecalho) {
        try {
            boolean vendaFechada = false;
            Double valorFinal = null;
            if (pVendaCabecalho.getStatusVenda().toString().equals("F")) {
                vendaFechada = true;
            }
            if (pVendaCabecalho.getValorFinal() == null) {
                valorFinal = 0.0;
            }
            String tripa = String.valueOf(pVendaCabecalho.getId())
                    + String.valueOf(pVendaCabecalho.getCcf())
                    + String.valueOf(pVendaCabecalho.getCoo())
                    + Biblioteca.formatoDecimal("V", valorFinal)
                    + pVendaCabecalho.getSerieEcf()
                    + "CS0";

            pVendaCabecalho.setStatusVenda('C');
            pVendaCabecalho.setCupomCancelado('S');
            pVendaCabecalho.setHashTripa(Biblioteca.MD5String(tripa));
            pVendaCabecalho.setHashIncremento(-1);
            pVendaCabecalho = (EcfVendaCabecalho) JPAUtil.mergeObjeto(pVendaCabecalho);
            if (vendaFechada) {
                ProdutoController produtoControl = new ProdutoController();
                produtoControl.atualizaEstoque(vendaDetalhe(pVendaCabecalho.getId()), true);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void cancelaItem(EcfVendaDetalhe pVendaDetalhe) {
        try {
            String tripa = Caixa.configuracao.getIdEcfImpressora().getSerie()
                    + pVendaDetalhe.getCoo()
                    + pVendaDetalhe.getCcf()
                    + pVendaDetalhe.getGtin()
                    + Biblioteca.formatoDecimal("Q", Double.parseDouble(pVendaDetalhe.getQuantidade().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(pVendaDetalhe.getValorUnitario().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(pVendaDetalhe.getTotalItem().toString()))
                    + pVendaDetalhe.getTotalizadorParcial() + "S" + "0";
            pVendaDetalhe.setHashTripa(Biblioteca.MD5String(tripa));
            pVendaDetalhe.setHashIncremento(-1);
            JPAUtil.mergeObjeto(pVendaDetalhe);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public EcfVendaCabecalho ultimaVenda() {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM EcfVendaCabecalho c WHERE c.id = (SELECT MAX(v1.id) FROM EcfVendaCabecalho v1");
        EcfVendaCabecalho retorno;
        try {
            retorno = (EcfVendaCabecalho) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    public void marcarVendaComProblema(EcfVendaCabecalho pVendaCabecalho) {
        pVendaCabecalho.setStatusVenda('P');
        JPAUtil.mergeObjeto(pVendaCabecalho);
    }

    public EcfVendaCabecalho verificaVendaComProblema() {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM EcfVendaCabecalho c WHERE c.statusVenda = 'P'");
        EcfVendaCabecalho retorno;
        try {
            retorno = (EcfVendaCabecalho) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    private EcfVendaCabecalho calculaImpostos(EcfVendaCabecalho vendaCabecalho) {
        try {
            List<EcfVendaDetalhe> listaVendaDetalhe = vendaDetalhe(vendaCabecalho.getId());

            BigDecimal icmsCabecalho = BigDecimal.ZERO;
            BigDecimal icmsBase = BigDecimal.ZERO;
            BigDecimal icmsOutras = BigDecimal.ZERO;
            EcfVendaDetalhe vendaDetalhe;

            for (int i = 0; i < listaVendaDetalhe.size(); i++) {
                vendaDetalhe = listaVendaDetalhe.get(i);

                if (vendaDetalhe.getTotalizadorParcial().equals("N1") || vendaDetalhe.getTotalizadorParcial().equals("F1")) {
                    icmsOutras = icmsOutras.add(vendaDetalhe.getValorTotal());
                    icmsOutras = icmsOutras.setScale(Caixa.configuracao.getDecimaisValor(), RoundingMode.DOWN);
                } else {
                    icmsBase = icmsBase.add(vendaDetalhe.getValorTotal());
                    icmsBase = icmsBase.setScale(Caixa.configuracao.getDecimaisValor(), RoundingMode.DOWN);
                }

                icmsCabecalho = icmsCabecalho.add(vendaDetalhe.getIcms());
                icmsCabecalho = icmsCabecalho.setScale(Caixa.configuracao.getDecimaisValor(), RoundingMode.DOWN);
            }

            vendaCabecalho.setBaseIcms(icmsBase);
            vendaCabecalho.setIcmsOutras(icmsOutras);
            vendaCabecalho.setIcms(icmsCabecalho);

            return vendaCabecalho;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public List<EcfVendaDetalhe> vendaDetalhe(int idVendaCabecalho) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM EcfVendaDetalhe c WHERE c.idEcfVendaCabecalho.id = ?");
        q.setParameter(1, idVendaCabecalho);
        List<EcfVendaDetalhe> retorno = q.getResultList();
        em.close();
        return retorno;
    }
}
